package Net;

import java.util.*;

public abstract class Graph {
	private Vector<Node> Nodes = new Vector<Node>();
	//protected String srcXML;
	//private int Root = null;
	public Graph(){
		//this.srcXML = xml;
		//Nodes.clear();
	}
	public int GetNodesNum(){
		return Nodes.size();
	}
	public Node GetRoot(){
		boolean[] flag = new boolean[Nodes.size()];
		for(int j = 0; j < Nodes.size(); j++){
			flag[j] = false;
		}
		Line tmp;
		for(int i = 0; i < Nodes.size(); i++){
			tmp = Nodes.elementAt(i).getFirstLine() ;
			while(tmp != null){
				if(!flag[tmp.getAdjNodeId()]){
					flag[tmp.getAdjNodeId()] = true;
				}
				tmp = tmp.getNextLine();
			}
		}
		//int j = 0;
		for(int j = 0; j < Nodes.size(); j++){
			if(!flag[j]){
				System.out.println("root is " + j);
				return Nodes.elementAt(j);
			}
		}
		return null;
	}
	public int GetRootId(){
		boolean[] flag = new boolean[Nodes.size()];
		for(int j = 0; j < Nodes.size(); j++){
			flag[j] = false;
		}
		Line tmp;
		for(int i = 0; i < Nodes.size(); i++){
			tmp = Nodes.elementAt(i).getFirstLine() ;
			while(tmp != null){
				if(!flag[tmp.getAdjNodeId()]){
					flag[tmp.getAdjNodeId()] = true;
				}
				tmp = tmp.getNextLine();
			}
		}
		//int j = 0;
		for(int j = 0; j < Nodes.size(); j++){
			if(!flag[j]){
				System.out.println("root is " + j);
				return j;
			}
		}
		return -1;
	}
	
	protected int AddNode(Node node){
		this.Nodes.add(node);
		return Nodes.size();
	}
	protected int DeleteNode(Node node){
		this.Nodes.remove(node);
		return 0;
	}
	public Node FindNode(int nodeId){
		return Nodes.elementAt(nodeId);
	}
	protected int FindNodeId(String NodeName){
		for(int i= 0; i < Nodes.size(); i++){
			if(Nodes.get(i).GetName() == NodeName)
				return i;
		}
		return -1;
	}
}
